home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / wink24 / src / eup.c < prev    next >
Text File  |  1993-07-08  |  6KB  |  294 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <snd.h>
  5. #include "defs.h"
  6.  
  7. #define BUFF_SIZE (66000)
  8. #define BIOS_WORK_SIZE (16384)
  9.  
  10. extern char *swork;
  11. extern char *SPCSTR;
  12. extern BOOL Input();
  13. extern void wrtstr();
  14. extern int  File_sel();
  15.  
  16.        char buff[BUFF_SIZE];
  17. static int buff_size;
  18. static int buff_sw;
  19. static char *buff_top[2];
  20. static char *buff_btm[2];
  21. static char status_save;
  22.  
  23. static char *bios_work;
  24. static int tempo,signature;
  25. static int eof;
  26. static FILE *fp;
  27.  
  28. /*------------------------------------------------*/
  29. int ML_Start(buffer,size,work)
  30. char *buffer;
  31. int size;
  32. char *work;
  33. {
  34.     bios_work = work;
  35.     if((buff_size = (size/12)*6) < 64)
  36.         return(2);
  37.  
  38.     buff_top[0] = buffer;
  39.     buff_btm[0] = buff_top[0] + buff_size -6;
  40.     buff_top[1] = buff_top[0] + buff_size;
  41.     buff_btm[1] = buff_top[1] + buff_size -6;
  42.  
  43.     SND_eup_init(bios_work);
  44.     return(0);
  45. }
  46. /*------------------------------------------------*/
  47. int ML_End()
  48. {
  49.     SND_eup_end();
  50.     return(0);
  51. }
  52.  
  53.  
  54. /*------------------------------------------------*/
  55. int ML_Set(path)
  56. char *path;
  57. {
  58.     int i,err,size;
  59.     char buffer[128];
  60.     char bankpath[128];
  61.     char fm_bankname[8];
  62.     char pcm_bankname[8];
  63.     char tmppath[128];
  64.     char *p,*pp;
  65.  
  66.     eof = 1;
  67.     
  68.     if( (p = strrchr( path, '.' )) == NULL )
  69.         return 1;
  70.     if ( (strcmp( p, ".EUP") !=0) && 
  71.          (strcmp( p, ".eup") !=0) )
  72.         return 1;
  73.     
  74.     if((fp = fopen(path,"rb")) == NULL)
  75.         return(1);
  76.  
  77.     fseek(fp,852,SEEK_SET);
  78.  
  79.     if(fread(buffer,1,32,fp) < 32)
  80.         goto ERROR;
  81.     for(i=0 ; i<32 ;i++)
  82.         err=SND_eup_mute_set(i,(int)buffer[i]);
  83.  
  84.     if(fread(buffer,1,32,fp) < 32)
  85.         goto ERROR;
  86.     for(i=0 ; i<32 ;i++)
  87.         err=SND_eup_port_set(i,(int)buffer[i]);
  88.  
  89.     if(fread(buffer,1,32,fp) < 32)
  90.         goto ERROR;
  91.     for(i=0 ; i<32 ;i++)
  92.         err=SND_eup_midi_ch_set(i,(int)buffer[i]);
  93.  
  94.     if(fread(buffer,1,32,fp) < 32)
  95.         goto ERROR;
  96.     for(i=0 ; i<32 ;i++)
  97.         err=SND_eup_bias_set(i,(int)buffer[i]);
  98.  
  99.     if(fread(buffer,1,32,fp) < 32)
  100.         goto ERROR;
  101.     for(i=0 ; i<32 ;i++)
  102.         err=SND_eup_transpose_set(i,(int)buffer[i]);
  103. /*
  104. channel assign
  105. */
  106.     fseek(fp,1748,SEEK_SET);
  107.     if(fread(buffer,1,6,fp) < 6)
  108.         goto ERROR;
  109.     for(i = 0;i < 6;i++)
  110.         err=SND_midi_ch_assign(i,(int)buffer[i]);
  111.  
  112.     if(fread(buffer,1,8,fp) < 8)
  113.         goto ERROR;
  114.     for(i = 0;i < 8;i++)
  115.         err=SND_midi_ch_assign(i+64,(int)buffer[i]);
  116. /*
  117. bank load
  118. */
  119.     SND_pcm_mode_set(0);
  120.     
  121.     strcpy(    bankpath, path );
  122.     if( ( p = strrchr( bankpath, '\\') ) == NULL )
  123.         p = bankpath;
  124.     else
  125.         p++;
  126.  
  127.     if(fread( p,1,8,fp) < 8)
  128.         goto ERROR;
  129.     if( *p != '\0'){
  130.         for( pp=p, i=0 ;(*pp != '\0')&&(i<8); i++, pp++ )
  131.             ;
  132.         strcpy ( pp, ".FMB\0" );
  133.         if ( SND_fm_bank_load( bankpath,fm_bankname) != 0 ){
  134.             strcpy( tmppath, getenv("FMINST") );
  135.             if( ( pp = strrchr( tmppath, '\\') ) == NULL )
  136.                 pp = tmppath;
  137.             else
  138.                 pp++;
  139.             strcat( pp, p );
  140.             if ( SND_fm_bank_load( tmppath,fm_bankname) != 0 ){
  141.                 wrtstr(SPCSTR,30,1,0x1F);
  142.                 wrtstr("Can't open/read ",30,1,0x12);
  143.                   wrtstr( p,46,1,0x12);
  144.              }
  145.         }
  146.     }
  147.  
  148.     if(fread( p,1,8,fp) < 8)
  149.         goto ERROR;
  150.     if( *p != '\0'){
  151.         for( pp=p, i=0 ;(*pp != '\0')&&(i<8); i++, pp++ )
  152.             ;
  153.         strcpy ( pp, ".PMB\0" );
  154.         if ( SND_pcm_bank_load( bankpath,pcm_bankname) != 0 ){
  155.             strcpy( tmppath, getenv("PCMINST") );
  156.             if( ( pp = strrchr( tmppath, '\\') ) == NULL )
  157.                 pp = tmppath;
  158.             else
  159.                 pp++;
  160.             strcat( pp, p );
  161.             if ( SND_pcm_bank_load( tmppath,pcm_bankname) != 0 ){
  162.                  wrtstr(SPCSTR,30,1,0x1F);
  163.                 wrtstr("Can't open/read ",30,1,0x12);
  164.                 wrtstr( p,46,1,0x12);
  165.             }
  166.         }
  167.     }
  168.  
  169.     fseek(fp,2048,SEEK_SET);
  170.  
  171.     if(fread(&size,4,1,fp) < 1)
  172.         goto ERROR;
  173.     if(fread(buffer,1,2,fp) < 2)
  174.         goto ERROR;
  175.     signature = (int)buffer[0];
  176.     tempo = (int)buffer[1];
  177.  
  178.     eof = 0;
  179.     status_save = 0xfe;
  180.     buff_sw = 1;
  181.     load_sub();
  182.     load_sub();
  183.     SND_eup_tempo_set(tempo);
  184.     return(0);
  185. ERROR:
  186.     fclose(fp);
  187.     return(2);
  188. }
  189.  
  190. /*------------------------------------------------*/
  191. int ML_Play(mode)
  192. int mode;
  193. {
  194.     SND_eup_loop_set(mode);
  195.     SND_eup_play_start(buff_top[0],buff_size*2,signature);
  196.     return(0);
  197. }
  198.  
  199. /*------------------------------------------------*/
  200. int ML_Stop()
  201. {
  202.     SND_eup_play_stop();
  203.     if(eof == 0)
  204.         fclose(fp);
  205.     return(0);
  206. }
  207.  
  208. /*------------------------------------------------*/
  209. int ML_Check()
  210. {
  211.     char *ptr;
  212.  
  213.         if(eof != 0)
  214.             return(0);
  215.         ptr = SND_eup_stat_ptr();
  216.  
  217.         if(((buff_sw == 0) && (ptr <= buff_btm[0]))
  218.                 ||((buff_sw == 1) && (ptr >= buff_top[1])))
  219.             return(load_sub());
  220.         else
  221.             return(0);
  222.             
  223. }    
  224.  
  225. /*------------------------------------------------*/
  226. int load_sub()
  227. {
  228.     char *ptr;
  229.     char status;
  230.     int sw;
  231.  
  232.     if(!buff_sw){
  233.         buff_sw = 1;
  234.         sw = 0;
  235.     }
  236.     else{
  237.         buff_sw = 0;
  238.         sw = 1;
  239.     }
  240.     ptr = buff_top[buff_sw];
  241.     while((!eof) && (ptr <= buff_btm[buff_sw])){
  242.         if(fread(ptr,1,6,fp) < 6){
  243.             fclose(fp);
  244.             return(2);
  245.         }
  246.         else if(*ptr == 0xfe){
  247.             eof = 1;
  248.             fclose(fp);
  249.         }
  250.         ptr = ptr + 6;
  251.     }
  252.  
  253.     status = status_save;
  254.     if(!eof){
  255.         status_save = *buff_btm[buff_sw];
  256.         *buff_btm[buff_sw] = 0xfd;
  257.     }
  258.     *buff_btm[sw] =  status;
  259.     SND_eup_play_restart();
  260.     return(0);
  261. }
  262.  
  263.  
  264.  
  265.  
  266. void    runeup()
  267. {
  268. static unsigned char filename[160]={ 0 };
  269.  
  270.     /* filename[0] = '\0'; */
  271.     if ( Input(filename,"ファイル名:") != FALSE || File_sel(filename) != FALSE  )
  272.     return;
  273.  
  274.     ML_Stop();
  275.     wrtstr("ファイル読み込み中",30,1,0x15);
  276.  
  277.     if ( ML_Set( (char *)filename) ) {
  278.         ML_Stop();
  279.         goto ERROR;
  280.     }
  281.     ML_Play(0);
  282.     wrtstr(SPCSTR,30,1,0x1F);
  283.     wrtstr("  演奏開始  ",30,1,0x15);
  284.     return;
  285. ERROR: ;
  286.     wrtstr(SPCSTR,30,1,0x1F);
  287.     wrtstr("演奏出来ません",30,1,0x12);
  288. }
  289.  
  290.  
  291. void stopeup(){
  292.     ML_Stop();
  293. }
  294.